package com.easylinkin.linkappapi.alarm.service;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.easylinkin.linkappapi.alarm.entity.Alarm;
import com.easylinkin.linkappapi.alarm.entity.AlarmAnalyzeStatistic;
import com.easylinkin.linkappapi.alarm.entity.AlarmInfo;
import com.easylinkin.linkappapi.alarm.entity.AlarmStatistic;
import com.easylinkin.linkappapi.common.model.RequestModel;
import com.easylinkin.linkappapi.device.entity.Device;
import com.easylinkin.linkappapi.elasticsearch.entity.EsQuerymodel;
import com.easylinkin.linkappapi.ruleengine.entity.RuleExecution;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * <p>
 * 告警日志服务类
 * </p>
 *
 * @author Tongjie
 * @since 2020-04-25
 */
public interface AlarmService extends IService<Alarm> {

    /**
     * 告警日志分页查询
     */
    IPage<Alarm> getAlarmPage(Page page, Alarm customQueryParams);

    /**
     * 获取 20分钟以内的告警数据
     * @return 最近20分钟的告警列表
     */
    List<Alarm> getRecentAlarms();


    /**
     * 告警日志分页查询-所有项目
     * @param page 分页参数
     * @param customQueryParams 告警vo
     * @return 告警日志列表
     */
    IPage<Alarm> getAlarmPageGlobal(Page page, Alarm customQueryParams);

    /**
     * 电力监控告警日志查询分页
     * @param page 分页参数
     * @param alarm 告警vo
     * @return 告警日志列表
     */
    IPage<Alarm> getDistributionAlarmPage(Page page, Alarm alarm);

    /**
     * 查询告警 通过资产
     */
    IPage<Alarm> getAlarmPageByAsset(Page page, Alarm alarm);

    /**
     * 查看详情
     */
    Alarm getDetail(Alarm alarm);

    /**
     * 查看详情 2 小程序用
     * @param alarm 告警 vo
     * @return 单条查询结果
     */
    Alarm getDetail2(Alarm alarm);

    /**
     * 根据设备，以及其对应的告警规则判断是否应该产生告警； 若需要则插入告警
     *
     * @param device 设备对象
     * @return true:插入告警成功  false：插入失败或不需要产生告警
     */
//    boolean checkGenerateAlarm(Device device);

    Alarm getSourceJson(Alarm alarm);

    /**
     * 生成告警
     * @param device 设备vo
     * @param ruleExecution 执行器
     * @return
     */
    void generateAlarm(Device device, RuleExecution ruleExecution, Date date);

    List<Map> getAlarmStatisticsByRule(Alarm alarm);

    List<AlarmStatistic> getAlarmStatisticsByStatus(Alarm alarm);


    /**
     * 荆州油烟要求只统计 当日产生的维度统计
     *
     * @param alarm 告警vo
     * @return
     */
    List<AlarmStatistic> getAlarmStatisticsByStatus2(Alarm alarm);

    /**
     * 根据设备ID,告警ID 查询是否存在最新未处理的告警
     */
    boolean ifLatestNoHandleAlarmExist(Alarm alarm);

    /**
     * 根据设备code 查询未处理的告警的条数
     * @param deviceCode 设备code
     * @return 告警条数
     */
    int countAlarmByDeviceCodeAndStatus(String deviceCode,Integer status);
    
	List<AlarmInfo> getAlarmStatisticsAudit(Alarm alarm);


	void getAlarmStatisticsAuditTask(Alarm alarm);

    AlarmAnalyzeStatistic statisticAlarmCountBySpace(EsQuerymodel esQuerymodel);

    AlarmAnalyzeStatistic statisticNormalUserAlarmCount(EsQuerymodel esQuerymodel);

    /**
     * 定时采集 告警信息统计信息
     */
	void getAlarmStatisticsAuditTask();

    /**
     * 获取当前端口号
     */
    Object getCurrentServicePort();

    /**
     * 导出数据
     * @param alarm
     * @param request
     * @param response
     */
    void exportData(Alarm alarm, HttpServletRequest request, HttpServletResponse response);

    /**
     * 查询 满足条件的告警数
     * @param alarm
     * @return
     */
    int countAlarm(Alarm alarm);

    JSONObject getAlarmListForBigScreen();

    /**
     * 安全管理大屏查询告警信息
     * @return
     */
    Map<String, Object> countSecurityAlarmList();

    /**
     * 安全管理大屏查询告警信息列表
     * @param requestModel
     * @return
     */
    IPage<Alarm> getSecurityAlarmList(RequestModel<Alarm> requestModel);
}
